/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmi;

import controller.dialog.Load;
import interfaces.AddObservador;
import interfaces.Jogadas;
import interfaces.PlayJogador;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javafx.application.Platform;
import model.TAGS;

/*
 * Classe que gerência todas as conexão e a troca de mensagem com o servidor
 * A implementação da classe segue o padrão de projeto Singleton
 * @author Adriano
 */
public class RMIServer {

    private static RMIServer instacia;
    private static Registry r;
    private PlayJogador playJogador;
    private AddObservador addObservador;
    private Jogadas jogadas;

    public RMIServer() {
        try {
            r = LocateRegistry.getRegistry(TAGS.SERVER_HOST, TAGS.PORT);
            playJogador = (PlayJogador) r.lookup("servidorJogador");
            jogadas = (Jogadas) r.lookup("servidorJogadas");
        } catch (Exception e) {}
    }

    public static RMIServer getInstacia() {
        if (instacia == null) {
            synchronized (RMIServer.class) {
                if (instacia == null) {
                    instacia = new RMIServer();
                }
            }
        }
        return instacia;
    }

    public PlayJogador getPlayJogador() {
        if (playJogador == null) {
            try {
                playJogador = (PlayJogador) r.lookup("servidorJogador");
            } catch (Exception e) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        Load.getLoad().getSage().close();
                    }
                });
            }
        }
        return playJogador;
    }

    public AddObservador getAddObservador() {
        if (addObservador == null) {
            try {
                addObservador = (AddObservador) r.lookup("Observador");
            } catch (Exception e) {}
        }
        return addObservador;
    }

    public Jogadas getJogadas() {
        if (jogadas == null) {
            try {
                jogadas = (Jogadas) r.lookup("servidorJogadas");
            } catch (Exception e) {}
        }
        return jogadas;
    }

    public void exitObserver() {
        try {
            RMIServer.getInstacia().getPlayJogador().confirmar(TAGS.NAME);
            r.unbind("Observador");
        } catch (Exception e) {}
    }
}
